home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dprint / selsheet.c < prev   
Text File  |  1994-08-11  |  5KB  |  273 lines

  1. /*
  2. 8086|Printman/POSTCARD 設定シート
  3. Copyright (c) 1993,94 Delmonta
  4.  
  5. */
  6.  
  7. #include<string.h>
  8. #include"dprint.h"
  9.  
  10. static    unsigned    Startpos;
  11. static    struct SHEETDAT    *Sheet;
  12. static    unsigned    Num;
  13. static    int        *Ret;
  14.  
  15. static    unsigned    Sheet_ypos;
  16.  
  17. /*---------------------------------------------------------------------------*/
  18.  
  19. static    int    minimum(unsigned y)
  20. {
  21. register int    i = Sheet[y].min;
  22.  
  23.     if    (i>=SHEET_CREF(0))
  24.         i = Ret[i-SHEET_CREF(0)];
  25.  
  26.     return i;
  27. }
  28.  
  29. static    int    maximum(unsigned y)
  30. {
  31. register int    i = Sheet[y].max;
  32.  
  33.     if    (i>=SHEET_CREF(0))
  34.         i = Ret[i-SHEET_CREF(0)];
  35.     return i;
  36. }
  37.  
  38. /*---------------------------------------------------------------------------*/
  39.  
  40. static    void    sheet_putchoices(unsigned y, unsigned x)
  41. {
  42.     struct SHEETSEL    *dat = (struct SHEETSEL *)Sheet[y].pos;
  43.  
  44.     if    (Ret[y]==x)
  45.     {
  46.         if    (Sheet_ypos == y)
  47.             printf("\033[7;37m");
  48.         else
  49.             printf("\033[36m");
  50.     }
  51.  
  52.     printf("\033[%u;%uH%s\033[0;37m",Startpos+y,dat[x].xpos,dat[x].mes);
  53. }
  54.  
  55. /*---------------------------------------------------------------------------*/
  56.  
  57. static    void    sheet_putdat(unsigned y)
  58. {
  59.  
  60.     if    (Sheet[y].type == SHEET_SELECT)
  61.     {
  62.         sheet_putchoices(y,Ret[y]);
  63.     }
  64.     else
  65.     {
  66.         char    buf[8];
  67.  
  68.         printf("\033[%u;18f", Startpos+y);
  69.  
  70.         if    (Sheet_ypos==y)
  71.             printf("\033[7;37m");
  72.  
  73.         switch    (Sheet[y].type)
  74.         {
  75.         case SHEET_VALUE1:
  76.             printf("%4d",Ret[y]);
  77.             break;
  78.         case SHEET_VALUE2:
  79.             printf("%s",putfract(buf,Ret[y]));
  80.             break;
  81.         case SHEET_STRING:
  82.             printf("%*s",-Sheet[y].max,(char *)Sheet[y].pos);
  83.             break;        /* maxに'-'をつけないと右寄せになる */
  84.         }
  85.         printf("\033[0;37m");
  86.     }
  87. }
  88.  
  89. /*---------------------------------------------------------------------------*/
  90.  
  91. static    void    chkval(unsigned start)
  92. {
  93.     unsigned    i;
  94.  
  95.     for    (i=start ; i<Num ; i++)
  96.     {
  97.         int    s,l;
  98.  
  99.         if    (Sheet[i].type != SHEET_VALUE1
  100.                     && Sheet[i].type != SHEET_VALUE2)
  101.             continue;
  102.  
  103.         s = minimum(i);
  104.         l = maximum(i);
  105.  
  106.         if    (Ret[i]<s)    Ret[i] = s;
  107.         else if    (Ret[i]>l)    Ret[i] = l;
  108.  
  109.         sheet_putdat(i);
  110.  
  111.         if    (Sheet[i].type==SHEET_VALUE1)
  112.         {
  113.             printf("\033[%u;28f(%4d~%4d)",Startpos+i,s,l);
  114.         }
  115.         else
  116.         {
  117.             char    buf[2][8];
  118.  
  119.             putfract(buf[0],s);
  120.             putfract(buf[1],l);
  121.  
  122.             printf("\033[%u;30f(%s~%s)",Startpos+i,buf[0],buf[1]);
  123.         }
  124.     }
  125. }
  126.  
  127. /*---------------------------------------------------------------------------*/
  128.  
  129. bool    dp_sheetselect(unsigned startpos, struct SHEETDAT sheet[],
  130.                             unsigned num,int ret[])
  131. {
  132.     int    i,j;
  133.     char    c;
  134.  
  135.     char    buf[64];        /* 文字列入力に使うバッファ */
  136.  
  137.     Startpos = startpos;
  138.     Sheet    = sheet;        /* 下請け関数でも値を共用できる */
  139.     Num      = num;            /* ようにするための配慮        */
  140.     Ret      = ret;
  141.  
  142.     Sheet_ypos = 0;
  143.  
  144.     for    (i=0 ; i<num ; i++)        /* 設定シートの初期化 */
  145.     {
  146.         printf("\033[%u;1f%-16s",Startpos+i,sheet[i].mes);
  147.  
  148.         switch    (sheet[i].type)
  149.         {
  150.         case SHEET_SELECT:
  151.             for    (j=0 ; j<sheet[i].max ; j++)
  152.                 sheet_putchoices(i,j);
  153.             break;
  154.         case SHEET_VALUE1:
  155.             printf("\033[36m[     ]\033[37m");
  156.             break;
  157.         case SHEET_VALUE2:
  158.             printf("\033[36m[    .  ]\033[37m");
  159.             break;
  160.         case SHEET_STRING:
  161.             printf("\033[36m[%62s]\033[37m","");
  162.         }
  163.  
  164.     }
  165.  
  166.     chkval(0);
  167.     sheet_putdat(0);
  168.  
  169. sheetsel_rep:
  170.     c = dp_getch();
  171.  
  172.     if    (c=='\r' || c=='\033')
  173.     {
  174.         for    (i=startpos ; i<startpos+num ; i++)
  175.             printf("\033[%u;1f\033[2K",i);
  176.  
  177.         return (c=='\r' ? TRUE : FALSE);
  178.     }
  179.     else if    (c==EXTKEY_H)
  180.     {
  181.         dp_getch();
  182.     }
  183.     else if    (c==UPKEY && Sheet_ypos>0)
  184.     {
  185.         sheet_putdat(Sheet_ypos--);
  186.         sheet_putdat(Sheet_ypos  );
  187.     }
  188.     else if    (c==DOWNKEY && Sheet_ypos+1<num)
  189.     {
  190.         sheet_putdat(Sheet_ypos++);
  191.         sheet_putdat(Sheet_ypos  );
  192.     }
  193.     else if    (sheet[Sheet_ypos].type==SHEET_SELECT)
  194.     {
  195.         if    (c==LEFTKEY && ret[Sheet_ypos]>0)
  196.         {
  197.             sheet_putchoices(Sheet_ypos,ret[Sheet_ypos]--);
  198.             sheet_putchoices(Sheet_ypos,ret[Sheet_ypos]  );
  199.         }
  200.         else if    (c==RIGHTKEY &&
  201.             ret[Sheet_ypos]+1 < sheet[Sheet_ypos].max)
  202.         {
  203.             sheet_putchoices(Sheet_ypos,ret[Sheet_ypos]++);
  204.             sheet_putchoices(Sheet_ypos,ret[Sheet_ypos]  );
  205.         }
  206.         else
  207.             putchar('\7');
  208.     }
  209.     else if    (c<' ')
  210.         putchar('\7');
  211.     else
  212.     {
  213.         dp_ungetch(c);
  214.  
  215.         printf("\033[%u;18f\033[0;37m",startpos+Sheet_ypos);
  216.  
  217.         switch    (sheet[Sheet_ypos].type)
  218.         {
  219.         case SHEET_VALUE1:
  220.             i = dp_getval();
  221.             if    (i!=-1)
  222.             {
  223.                 ret[Sheet_ypos] = i;
  224.                 chkval(Sheet_ypos);
  225.             }
  226.             break;
  227.         case SHEET_VALUE2:
  228.             if    (dp_getval2(&i))
  229.             {
  230.                 ret[Sheet_ypos] = i;
  231.                 chkval(Sheet_ypos);
  232.             }
  233.             break;
  234.         case SHEET_STRING:
  235.             strcpy(buf,(char *)sheet[Sheet_ypos].pos);
  236.             if    (strinput(buf,sheet[Sheet_ypos].max))
  237.                 strcpy((char *)sheet[Sheet_ypos].pos,buf);
  238.         }
  239.         sheet_putdat(Sheet_ypos);
  240.     }
  241.     goto sheetsel_rep;
  242. }
  243.  
  244. /*---------------------------------------------------------------------------*/
  245.  
  246. bool    input_st_ed(const char *mes,int *start, int *end)
  247. {
  248. static    struct SHEETDAT    sheet[] =
  249.     {
  250.         {SHEET_VALUE1,"始点",1,DUMMY,NULL},
  251.         {SHEET_VALUE1,"終点",SHEET_CREF(0),DUMMY,NULL},
  252.     };
  253.  
  254.     int    ret[2];
  255.  
  256.     if    (!iscardexist())
  257.         return FALSE;
  258.  
  259.     sheet[0].max = sheet[1].max = Cardnum;
  260.     ret[0]       = 1;
  261.     ret[1]       = Cardnum;
  262.  
  263.     printf("\033[%d;1f%sする範囲\n",SYSLINE_START,mes);
  264.  
  265.     if    (!dp_sheetselect(SYSLINE_START,sheet,2,ret))
  266.         return FALSE;
  267.  
  268.     *start = ret[0] - 1;    /* ユーザーにはカードは1番から始まっているよ */
  269.     *end   = ret[1] - 1;    /* うに見せているので、0から始まるように補正 */
  270.  
  271.     return TRUE;
  272. }
  273.